package com.example.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.example.entity.dto.Notification;

import com.example.entity.vo.response.NotificationVO;
import com.example.mapper.NotificationMapper;
import com.example.service.NotificationService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xusen
 * @since 2025-05-04
 */
@Service
/**
 * NotificationServiceImpl类实现了NotificationService接口，提供通知相关的服务
 * 它继承了ServiceImpl类，用于处理与Notification实体相关的数据库操作
 */
public class NotificationServiceImpl extends ServiceImpl<NotificationMapper, Notification> implements NotificationService {

    /**
     * 查询用户通知
     * 根据用户ID查询属于该用户的所有通知，并将其转换为通知视图对象列表
     *
     * @param uid 用户ID，用于查询属于该用户的通知
     * @return 返回一个NotificationVO对象列表，包含该用户的所有通知
     */
    public List<NotificationVO> findUserNotification(int uid) {
        // 使用用户ID查询通知列表
        return this.list(Wrappers.<Notification>query().eq("uid", uid))
                .stream()
                // 将每个通知对象转换为NotificationVO对象
                .map(notification -> notification.asViewObject(NotificationVO.class))
                // 收集转换后的通知视图对象到列表中
                .toList();
    }

    /**
     * 删除用户的特定通知
     */
    public void deleteUserNotification(int id, //id 通知的ID，用于标识特定的通知
                                       int uid){//uid 用户ID，确保只删除属于该用户的通知
        this.remove(Wrappers.<Notification>query().eq("id", id).eq("uid", uid));
    }

    /**
     * 删除用户的所有通知
     *
     * @param
     */
    public void deleteUserAllNotification(int uid){// uid 用户ID，用于标识所有通知的拥有者
        this.remove(Wrappers.<Notification>query().eq("uid", uid));
    }

    /**
     * 添加新的通知
     *
     * @param uid 用户ID，通知的接收者
     * @param title 通知的标题
     * @param content 通知的内容
     * @param type 通知的类型
     * @param url 通知相关的URL，用于链接到相关内容
     */
    @Override
    public void addNotification(int uid, String title, String content, String type, String url) {
        Notification notification = new Notification();
        notification.setUid(uid);
        notification.setTitle(title);
        notification.setContent(content);
        notification.setType(type);
        notification.setUrl(url);
        this.save(notification);
    }
}

